home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / comms / other / novia / src / api / novia_tcpip_api.c < prev    next >
C/C++ Source or Header  |  1999-12-06  |  26KB  |  1,322 lines

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <sys/param.h>
  4. #include <netinet/in.h>
  5. #include <netdb.h>
  6. #include <errno.h>
  7. #include <sys/param.h>
  8. #include <stdio.h>
  9. #include <unistd.h>
  10. #include <string.h>
  11. #include <netdb.h>
  12. #include <fcntl.h>
  13.  
  14. #include <pragma/exec_lib.h>
  15. #include <pragma/socket_lib.h>
  16. #include <pragma/noviasys_lib.h>
  17. #include <novia/novia_portdata.h>
  18. #include <exec/tasks.h>
  19. #include <devices/timer.h>
  20. #include <novia/novia_config.h>
  21. #include <novia/novia_dos.h>
  22. #include <novia/novia_registers.h>
  23.  
  24. #define PORTADDRESS 110
  25.  
  26. #include "novia_tcpip_api.h"
  27.  
  28. extern int VerboseLevel;   /* prepare use of lprintf */
  29. extern MainPortConfig *mainportconfig;
  30.  
  31. struct Library *SocketBase = NULL;
  32.  
  33. int recvExactlynbytes(int socket, char *buffer, int numbytestoreceive, int flags );
  34. void ht ( void );
  35. extern void ClearMem(APTR start,ULONG len);
  36. char *SendKey(int socket, char *string);
  37. void bzero(APTR start, ULONG len);
  38. int readsocket(int socket, char *ptr, ULONG len);
  39.  
  40. void __saveds ASM nslib_CopyUUCPName(register __a0 char *string, register __a1 char *RealName, register __a2 char *Name);
  41. UBYTE __saveds ASM nslib_GetUUCPMonth(register __a0 char *string);
  42. void __saveds ASM nslib_ConvertUUCPDate(register __a0 char *string, register __a1 struct Date *date);
  43.  
  44. struct timeval tv;
  45. int retval;
  46. extern struct Date actualdate;
  47.  
  48. char uucp_char[] = { 0,
  49. 0,
  50. 0,
  51. 0,
  52. 0,
  53. 0,
  54. 0,
  55. 0,
  56. 0,
  57. 0,
  58. 0,
  59. 0,
  60. 0,
  61. 0,
  62. 0,
  63. 0,
  64. 0,
  65. 0,
  66. 0,
  67. 0,
  68. 0,
  69. 0,
  70. 0,
  71. 0,
  72. 0,
  73. 0,
  74. 0,
  75. 0,
  76. 0,
  77. 0,
  78. 0,
  79. 0,
  80. 0,
  81. 1,
  82. 0,
  83. 0,
  84. 0,
  85. 1,
  86. 1,
  87. 0,
  88. 1,
  89. 1,
  90. 1,
  91. 1,
  92. 0,
  93. 1,
  94. 1,
  95. 0,
  96. 1,
  97. 1,
  98. 1,
  99. 1,
  100. 1,
  101. 1,
  102. 1,
  103. 1,
  104. 1,
  105. 1,
  106. 0,
  107. 0,
  108. 0,
  109. 1,
  110. 0,
  111. 1,
  112. 1,
  113. 1,
  114. 1,
  115. 1,
  116. 1,
  117. 1,
  118. 1,
  119. 1,
  120. 1,
  121. 1,
  122. 1,
  123. 1,
  124. 1,
  125. 1,
  126. 1,
  127. 1,
  128. 1,
  129. 1,
  130. 1,
  131. 1,
  132. 1,
  133. 1,
  134. 1,
  135. 1,
  136. 1,
  137. 1,
  138. 0,
  139. 0,
  140. 0,
  141. 0,
  142. 0,
  143. 1,
  144. 0,
  145. 1,
  146. 1,
  147. 1,
  148. 1,
  149. 1,
  150. 1,
  151. 1,
  152. 1,
  153. 1,
  154. 1,
  155. 1,
  156. 1,
  157. 1,
  158. 1,
  159. 1,
  160. 1,
  161. 1,
  162. 1,
  163. 1,
  164. 1,
  165. 1,
  166. 1,
  167. 1,
  168. 1,
  169. 1,
  170. 1,
  171. 0,
  172. 0,
  173. 0,
  174. 0,
  175. 0,
  176. 0,
  177. 0,
  178. 0,
  179. 0,
  180. 0,
  181. 0,
  182. 0,
  183. 0,
  184. 0,
  185. 0,
  186. 0,
  187. 0,
  188. 0,
  189. 0,
  190. 0,
  191. 0,
  192. 0,
  193. 0,
  194. 0,
  195. 0,
  196. 0,
  197. 0,
  198. 0,
  199. 0,
  200. 0,
  201. 0,
  202. 0,
  203. 0,
  204. 0,
  205. 0,
  206. 0,
  207. 0,
  208. 1,
  209. 1,
  210. 1,
  211. 1,
  212. 1,
  213. 1,
  214. 1,
  215. 1,
  216. 1,
  217. 1,
  218. 1,
  219. 1,
  220. 1,
  221. 1,
  222. 1,
  223. 1,
  224. 1,
  225. 1,
  226. 1,
  227. 1,
  228. 1,
  229. 1,
  230. 1,
  231. 1,
  232. 1,
  233. 1,
  234. 1,
  235. 1,
  236. 1,
  237. 1,
  238. 1,
  239. 1,
  240. 1,
  241. 1,
  242. 1,
  243. 1,
  244. 1,
  245. 1,
  246. 1,
  247. 1,
  248. 1,
  249. 1,
  250. 1,
  251. 1,
  252. 1,
  253. 1,
  254. 1,
  255. 1,
  256. 1,
  257. 1,
  258. 1,
  259. 1,
  260. 1,
  261. 1,
  262. 1,
  263. 1,
  264. 1,
  265. 1,
  266. 1,
  267. 1,
  268. 1,
  269. 1,
  270. 1,
  271. 1,
  272. 1,
  273. 1,
  274. 1,
  275. 1,
  276. 1,
  277. 1,
  278. 1,
  279. 1,
  280. 1,
  281. 1,
  282. 1,
  283. 1,
  284. 1,
  285. 1,
  286. 1,
  287. 1,
  288. 1,
  289. 1,
  290. 1,
  291. 1,
  292. 1,
  293. 1,
  294. 1,
  295. 1,
  296. 1,
  297. 1,
  298. 1,
  299. 1,
  300. 1,
  301. 1,
  302. 1,
  303. 1};
  304.  
  305. LONG __saveds ASM nslib_uucp_sendmail(register __a0 INet_POP3Server *server, register __a1 INet_Mail *mail)
  306. {
  307.     struct PortData *cport = (struct PortData *)FindTask(NULL)->tc_UserData;
  308.     int failat = 0;
  309.     List headerlist;
  310.     if ((SocketBase = OpenLibrary("bsdsocket.library",0)))
  311.     {    
  312.         struct hostent *hp;
  313.         struct sockaddr_in sa;
  314.         int s;
  315.         char buf[200];
  316.         ULONG counter = 0;
  317.     
  318.         /*********************************************************\
  319.         *                                                         *
  320.         *                       SEND MAIL                         *
  321.         *                                                         *
  322.         \*********************************************************/
  323.  
  324.  
  325.         if (server)
  326.         {
  327.             printf("NOViA SMTP-Mailer (RFC-821)\n");
  328.             printf("---------------------------\n");
  329.             printf("servername: %s\n",server->Name);
  330.             printf("domain    : %s\n",server->Domain);
  331.             printf("SMTPHost  : %s\n",server->SMTPHost);
  332.             printf("---------------------------\n");
  333.             printf("connecting to %s ...\n",server->SMTPHost);
  334.             if((hp = gethostbyname(server->SMTPHost)))
  335.             {
  336.                 printf("get sock ok\n");
  337.                 ClearMem(&sa, sizeof(sa));
  338.                 CopyMem(hp->h_addr, (char *)&sa.sin_addr, hp->h_length);
  339.     
  340.                 sa.sin_family = hp->h_addrtype;
  341.                 sa.sin_port      = htons((u_short)25);
  342.             
  343.                 if ((s = socket(hp->h_addrtype,SOCK_STREAM,0)) >= 0)
  344.                 {
  345.                     if (connect(s,(struct sockaddr *) &sa,sizeof(sa))>= 0)
  346.                     {
  347.                         struct Node *node = (Node *)mail->to_list.mlh_Head;
  348.                         char *buffer;
  349.                         LONG erg;
  350.                         fd_set readable;
  351.                         FD_ZERO(&readable);
  352.                         FD_SET(0, &readable);
  353.                         tv.tv_secs    = 30;
  354.                         tv.tv_micro    = 0;
  355.                         ClearMem(buf,200);
  356.                         if (WaitSelect(1, &readable, NULL, NULL, &tv, 0))
  357.                         {
  358.                             if ((erg = recv(s,buf,199,0)) != -1)
  359.                             {
  360.                                 StrToLong(buf,&erg);
  361.                                 if (erg != 220)
  362.                                 {
  363.                                     printf("server connecting failat: %s",buf);
  364.                                     failat = TRUE;
  365.                                 }
  366.                                 else
  367.                                 {
  368.                                     printf("connected to %s\n",server->SMTPHost);
  369.                                 }
  370.                             }
  371.                             else
  372.                             {
  373.                                 printf("no reply message: %d\n",erg);
  374.                                 failat = TRUE;
  375.                             }
  376.                         }
  377.                         else
  378.                         {
  379.                             printf("Timeout!!!\n");
  380.                             failat = TRUE;
  381.                         }
  382.  
  383.                 /*** HELLO ***/
  384.  
  385.                         if (!failat)
  386.                         {
  387.                             sprintf(buf,"HELO %s\r\n",server->Username);
  388.                             if ((buffer = SendKey(s,buf)))
  389.                             {
  390.                                 StrToLong(buffer, &erg);
  391.                                 if (erg != 250)
  392.                                 {
  393.                                     printf("Logon procedure failat: %s",buffer);
  394.                                     failat = TRUE;
  395.                                 }
  396.                                 else
  397.                                     printf("logged in.\n");
  398.                             }
  399.                             else
  400.                                 failat = TRUE;
  401.                         }
  402.  
  403.                 /*** MAIL FROM: ***/
  404.  
  405.                         if (!failat)
  406.                         {
  407.                             sprintf(buf,"MAIL FROM:<%s>\r\n",mail->from);
  408.                             if ((buffer = SendKey(s,buf)))
  409.                             {
  410.                                 StrToLong(buffer, &erg);
  411.                                 if (erg < 250 | erg > 251)
  412.                                 {
  413.                                     printf("FROM failat: %s",buffer);
  414.                                     failat = TRUE;
  415.                                 }
  416.                                 else
  417.                                 {
  418.                                     printf("Sender ok.\n");
  419.                                 }
  420.                             }
  421.                             else
  422.                                 failat = TRUE;
  423.                         }
  424.  
  425.                 /*** RCPT TO: ***/
  426.  
  427.                         while (!failat && node->ln_Succ)
  428.                         {
  429.                             sprintf(buf,"RCPT TO:<%s>\r\n",node->ln_Name);
  430.                             if ((buffer = SendKey(s,buf)))
  431.                             {
  432.                                 StrToLong(buffer, &erg);
  433.                                 if (erg < 250 | erg > 251)
  434.                                 {
  435.                                     printf("RCPT failat: %s",buffer);
  436.                                     failat = TRUE;
  437.                                 }
  438.                                 else
  439.                                     printf("Empfänger ok.\n");
  440.                             }
  441.                             else
  442.                                 failat = TRUE;
  443.                             node = node->ln_Succ;
  444.                         }
  445.  
  446.                 /*** DATA ***/
  447.  
  448.                         if (!failat)
  449.                         {
  450.                             sprintf(buf,"DATA\r\n");
  451.                             if ((buffer = SendKey(s,buf)))
  452.                             {
  453.                                 StrToLong(buffer, &erg);
  454.                                 if (erg != 354)
  455.                                 {
  456.                                     printf("failat to sending DATA: %s",buffer);
  457.                                     failat = TRUE;
  458.                                 }
  459.                                 else
  460.                                 {
  461.                                     if (send(s, mail->text, strlen(mail->text), 0) != -1)
  462.                                     {
  463.                                         fd_set readable;
  464.                                         ULONG mask;
  465.                                         FD_ZERO(&readable);
  466.                                         FD_SET(0, &readable);
  467.                                         tv.tv_secs    = 20;
  468.                                         tv.tv_micro    = 0;
  469.                                         if ((mask = WaitSelect(1, &readable, NULL, NULL, &tv, 0)))
  470.                                         {
  471.                                             if (recv(s, buffer, 1023, 0) == -1)
  472.                                             {
  473.                                                 failat = TRUE;
  474.                                                 printf("send mail failat: %s\n",buffer);
  475.                                             }
  476.                                             else
  477.                                                 printf("read ok: %s\n",buffer);
  478.                                         }
  479.                                         else
  480.                                         {
  481.                                             failat = TRUE;
  482.                                             printf("send mail failat.\n");
  483.                                         }
  484.                                     }
  485.                                 }
  486.                                 FreeVec(buffer);
  487.                             }
  488.                             else
  489.                                 failat = TRUE;
  490.                         }
  491.  
  492.  
  493.                         if (!failat)
  494.                         {
  495.                             sprintf(buf,"\r\n.\r\n");
  496.                             if ((buffer = SendKey(s,buf)))
  497.                             {
  498.                                 FreeVec(buffer);
  499.                             }
  500.                             else
  501.                                 failat = TRUE;
  502.                         }
  503.  
  504.  
  505.                 /*** QUIT ***/
  506.  
  507.                         if (!failat)
  508.                         {
  509.                             sprintf(buf,"QUIT\r\n");
  510.                             if ((buffer = SendKey(s,buf)))
  511.                             {
  512.                                 StrToLong(buffer, &erg);
  513.                                 if (erg != 221)
  514.                                 {
  515.                                     printf("close connecting failat, break socket connection: %s",buffer);
  516.                                     failat = TRUE;
  517.                                 }
  518.                                 else
  519.                                 {
  520.                                     printf("connecting closed.\n");
  521.                                 }
  522.                             }
  523.                             else
  524.                                 failat = TRUE;
  525.                         }
  526.                     }
  527.                 }
  528.             }
  529. //            cleanup_sockets();                    
  530.         }
  531.     }
  532.     else
  533.         printf("can't open bsdsocket.library\n");
  534.     return failat;
  535. }
  536.  
  537. LONG __saveds ASM nslib_uucp_getmails(register __a0 INet_POP3Server *server)
  538. {
  539.     struct PortData *cport = (struct PortData *)FindTask(NULL)->tc_UserData;
  540.     LONG result    = 0;
  541.     List savedlist;
  542.     List serverlist;
  543.     BPTR fh;
  544.     char path[120];
  545.  
  546.     char    *fullpath    = server->InboundPath;
  547.     ULONG length_fp    = strlen(fullpath);
  548.  
  549.     if (fullpath[length_fp - 1] == ':' | fullpath[length_fp - 1] == '/')
  550.         sprintf(path,"%s.index",fullpath);
  551.     else
  552.         sprintf(path,"%s/.index",fullpath);
  553.  
  554.     NewList(&savedlist);
  555.     NewList(&serverlist);
  556.  
  557.  
  558.     if ((fh = Open(path, MODE_READWRITE)))
  559.     {
  560.         char quit = FALSE;
  561.         struct INet_MailHeader *header;
  562.         while (!quit)
  563.         {
  564.             if ((header = AllocVec(sizeof(INet_MailHeader), MEMF_ANY | MEMF_CLEAR)))
  565.             {
  566.                 if ((Read(fh, header, sizeof(INet_MailHeader)) == sizeof(INet_MailHeader)))
  567.                 {
  568.                     AddTail((List *)&savedlist, (Node *)header);
  569.                 }
  570.                 else
  571.                 {
  572.                     FreeVec(header);
  573.                     quit = TRUE;
  574.                 }
  575.             }
  576.         }
  577.  
  578.         if ((SocketBase = OpenLibrary("bsdsocket.library",0)))
  579.         {    
  580.             struct hostent *hp;
  581.             struct sockaddr_in sa;
  582.             int s;
  583.             char buf[200];
  584.             ULONG counter = 0;
  585.         
  586.             /*********************************************************\
  587.             *                                                         *
  588.             *                         GET MAIL                        *
  589.             *                                                         *
  590.             \*********************************************************/
  591.     
  592.     
  593.             while (server && server->ln_Succ)
  594.             {
  595.                 printf("NOViA POP3 Client\n");
  596.                 printf("---------------------------\n");
  597.                 printf("servername: %s\n",server->Name);
  598.                 printf("domain    : %s\n",server->Domain);
  599.                 printf("SMTPHost  : %s\n",server->POP3Host);
  600.                 printf("---------------------------\n");
  601.                 printf("connecting to %s ...\n",server->POP3Host);
  602.  
  603.             /*** get ip-address from Domain Name Server ***/
  604.  
  605.                 if((hp = gethostbyname(server->POP3Host)))
  606.                 {
  607.                     ClearMem(&sa, sizeof(sa));
  608.                     CopyMem(hp->h_addr, (char *)&sa.sin_addr, hp->h_length);
  609.         
  610.                     sa.sin_family = hp->h_addrtype;
  611.                     sa.sin_port      = htons((u_short) 110);
  612.                 
  613.             /*** create socket ***/
  614.  
  615.                     if ((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) >= 0)
  616.                     {
  617.  
  618.             /*** connect POP Server ***/
  619.  
  620.                         if (connect(s,(struct sockaddr *) &sa, sizeof(sa))>= 0)
  621.                         {
  622.                             char *buffer;
  623.                             LONG erg;
  624.                             LONG Mails = 0;
  625.                             LONG size  = 0;
  626.                             char quit  = FALSE;
  627.                             fd_set readable;
  628.                             FD_ZERO(&readable);
  629.                             FD_SET(0, &readable);
  630.                             tv.tv_secs    = 30;
  631.                             tv.tv_micro    = 0;
  632.                             ClearMem(buf,200);
  633.                             if (WaitSelect(1, &readable, NULL, NULL, &tv, 0))
  634.                             {
  635.                                 if ((recv(s,buf,199,0)) != -1)
  636.                                 {
  637.                                     if (buf[0] == '+' && buf[1] == 'O' && buf[2] == 'K')
  638.                                     {
  639.                                         printf("connected to %s %s\n",server->POP3Host,buf);
  640.                                     }
  641.                                     else
  642.                                     {
  643.                                         result = TRUE;
  644.                                         printf("server connecting failat: %s",buf);
  645.                                     }
  646.                                 }
  647.                                 else
  648.                                 {
  649.                                     printf("no reply message: %d\n",erg);
  650.                                     result = TRUE;
  651.                                 }
  652.                             }
  653.                             else
  654.                             {
  655.                                 printf("Timeout!!!\n");
  656.                                 result = TRUE;
  657.                             }
  658.  
  659.  
  660.             /*** USER <> ***/
  661.  
  662.                             if (!result)
  663.                             {
  664.                                 sprintf(buf,"USER %s\r\n",server->Username);
  665.                                 if ((buffer = SendKey(s,buf)))
  666.                                 {
  667.                                     if (buffer[0] == '+' && buffer[1] == 'O' && buffer[2] == 'K')
  668.                                     {
  669.                                         printf("logged in.\n");
  670.                                     }
  671.                                     else
  672.                                     {
  673.                                         printf("Logon procedure failat: %s",buffer);
  674.                                         result = TRUE;
  675.                                     }
  676.                                     FreeVec(buffer);
  677.                                 }
  678.                                 else
  679.                                     result = TRUE;
  680.                             }
  681.  
  682.  
  683.             /*** PASS <> ***/
  684.  
  685.                             if (!result)
  686.                             {
  687.                                 sprintf(buf,"PASS %s\r\n",server->Password);
  688.                                 printf("%s",buf);
  689.                                 if ((buffer = SendKey(s,buf)))
  690.                                 {
  691.                                     if (buffer[0] == '+' && buffer[1] == 'O' && buffer[2] == 'K')
  692.                                     {
  693.                                         printf("password ok. logged in.\n");
  694.                                     }
  695.                                     else
  696.                                     {
  697.                                         printf("wrong password: %s",buffer);
  698.                                         result = TRUE;
  699.                                     }
  700.                                     FreeVec(buffer);
  701.                                 }
  702.                                 else
  703.                                 {
  704.                                     result = TRUE;
  705.                                 }
  706.                             }
  707.  
  708.                 /*** STAT <> ***/
  709.  
  710.                             if (!result)
  711.                             {
  712.                                 sprintf(buf,"STAT\r\n");
  713.                                 if ((buffer = SendKey(s,buf)))
  714.                                 {
  715.                                     if (buffer[0] == '+' && buffer[1] == 'O' && buffer[2] == 'K')
  716.                                     {
  717.                                         char *ptr = buffer;
  718.                                         printf("Get Statistik ok.\n");
  719.                                         while (*ptr && *ptr != ' ')
  720.                                             ptr++;
  721.                                         while (*ptr && !isdigit(*ptr))
  722.                                             ptr++;
  723.                                         StrToLong(ptr, &Mails);
  724.                                         while (*ptr && *ptr != ' ')
  725.                                             ptr++;
  726.                                         while (*ptr && !isdigit(*ptr))
  727.                                             ptr++;
  728.                                         StrToLong(ptr, &size);
  729.                                         printf("Mails: %d\n",Mails);
  730.                                         printf("size : %d\n",size);
  731.                                     }
  732.                                     else
  733.                                     {
  734.                                         printf("STAT command failat. %s",buffer);
  735.                                         result = TRUE;
  736.                                     }
  737.                                     FreeVec(buffer);
  738.                                 }
  739.                                 else
  740.                                     result = TRUE;
  741.                             }
  742.  
  743.  
  744.                 /*** LIST <> ***/
  745.  
  746.                             if (!result)
  747.                             {
  748.                                 char *ptr;
  749.                                 char *ptr2;
  750.                                 char lineok;
  751.                                 sprintf(buf,"LIST\r\n");
  752.                                 printf("%s",buf);
  753.                                 if ((buffer = SendKey(s,buf)))
  754.                                 {
  755.                                     if (buffer[0] == '+' && buffer[1] == 'O' && buffer[2] == 'K')
  756.                                     {
  757.                                         printf("LIST.\n%s",buffer);
  758.                                         ptr = buffer;
  759.                                         while (*ptr && *ptr != 10 && *ptr != 13)        // jump to next line
  760.                                             ptr++;
  761.                                         while (*ptr && (*ptr == 10 && *ptr ==13))
  762.                                             ptr++;
  763.                                     }
  764.                                     else
  765.                                     {
  766.                                         printf("wrong password: %s",buffer);
  767.                                         result = TRUE;
  768.                                     }
  769.                                 }
  770.                                 else
  771.                                 {
  772.                                     result = TRUE;
  773.                                 }
  774.                                 while (!quit && !result)
  775.                                 {
  776.                                     ptr2 = ptr;
  777.                                     lineok = FALSE;
  778.                                     while (*ptr2 && *ptr2 != 10 && *ptr2 != 13)    // checking for LF/CR on end of line
  779.                                         ptr2++;
  780.                                     if (*ptr2 == 13 | *ptr2 == 10)                    // if CR or LF line is ok
  781.                                     {
  782.                                         lineok = TRUE;
  783.                                     }
  784.                                     else                                                        // broken line, get more bytes from socket.
  785.                                     {
  786.                                         char *newbuf = AllocVec(1024, MEMF_ANY|MEMF_CLEAR);
  787.                                         if (ptr2 - ptr < 1024)
  788.                                         {
  789.                                             CopyMem(ptr, newbuf, ptr2 - ptr);        // copy first segment of line into new buffer.
  790.                                             ptr = newbuf + (ptr2 - ptr);                // start for next segment
  791.                                             if (readsocket(s, ptr, 1023 - (ptr2 - ptr)) == -1) // failat on readsocket ??
  792.                                             {
  793.                                                 printf("readsocket failat\n");
  794.                                                 quit = TRUE;
  795.                                             }
  796.                                             ptr = newbuf;
  797.                                             lineok = TRUE;
  798.                                         }
  799.                                         else
  800.                                         {
  801.                                             printf("unexpected error\n");            // is line bigger as 1024 bytes ?????
  802.                                             quit = TRUE;
  803.                                         }
  804.                                     }
  805.                                     if (!quit)
  806.                                     {
  807.                                         if ((header = AllocVec(sizeof(INet_MailHeader), MEMF_ANY|MEMF_CLEAR)))
  808.                                         {
  809.                                             while (*ptr && !isdigit(*ptr))
  810.                                                 ptr++;
  811.                                             StrToLong(ptr, (LONG *)&header->id);        // copy number of mail
  812.                                             printf("id: %d\n",header->id);
  813.                                             while (isdigit(*ptr))
  814.                                                 ptr++;
  815.                                             while (*ptr && !isdigit(*ptr))
  816.                                                 ptr++;
  817.                                             StrToLong(ptr, (LONG *)&header->size);    // copy size of message
  818.                                             printf("size: %d\n",header->size);
  819.                                             if (!header->id | !header->size)            // check of valid header
  820.                                                 FreeVec(header);
  821.                                             else
  822.                                                 AddTail(&serverlist, (Node *)header);
  823.                                         }
  824.                                         else
  825.                                         {
  826.                                             printf("can't alloc mem\n");
  827.                                             quit = TRUE;
  828.                                         }
  829.                                         while (*ptr && *ptr != 13 && *ptr != 10)    // set ptr to end of line
  830.                                             ptr++;
  831.                                         while (*ptr && (*ptr == 10 | *ptr == 13))
  832.                                             ptr++;
  833.                                     }
  834.                                 }
  835.                                 if (buffer)
  836.                                     FreeVec(buffer);
  837.                             }
  838.                             if (IsListEmpty(&serverlist))
  839.                             {
  840.                                 result = TRUE;
  841.                                 printf("no mails on server\n");
  842.                             }
  843.  
  844.                 /*** UIDL <> ***/
  845.  
  846.                             if (!result)
  847.                             {
  848.                                 char *ptr;
  849.                                 char *ptr2;
  850.                                 char lineok;
  851.                                 INet_MailHeader *header;
  852.                                 quit = FALSE;
  853.                                 sprintf(buf,"UIDL\r\n");
  854.                                 printf("%s",buf);
  855.                                 if ((buffer = SendKey(s,buf)))
  856.                                 {
  857.                                     if (buffer[0] == '+' && buffer[1] == 'O' && buffer[2] == 'K')
  858.                                     {
  859.                                         printf("UIDL.\n%s",buffer);
  860.                                         ptr = buffer;
  861.                                         while (*ptr && *ptr != 10 && *ptr != 13)        // jump to next line
  862.                                             ptr++;
  863.                                         while (*ptr && (*ptr == 10 && *ptr ==13))
  864.                                             ptr++;
  865.                                     }
  866.                                     else
  867.                                     {
  868.                                         printf("wrong password: %s",buffer);
  869.                                         result = TRUE;
  870.                                     }
  871.                                 }
  872.                                 else
  873.                                 {
  874.                                     result = TRUE;
  875.                                 }
  876.                                 header = (struct INet_MailHeader *)serverlist.lh_Head;
  877.                                 if (!header->ln_Succ | !header->ln_Pred)
  878.                                     result = TRUE;
  879.                                 while (!quit && !result)
  880.                                 {
  881.                                     ptr2 = ptr;
  882.                                     lineok = FALSE;
  883.                                     while (*ptr2 && *ptr2 != 10 && *ptr2 != 13)    // checking for LF/CR on end of line
  884.                                         ptr2++;
  885.                                     if (*ptr2 == 13 | *ptr2 == 10)                    // if CR or LF line is ok
  886.                                     {
  887.                                         lineok = TRUE;
  888.                                     }
  889.                                     else                                                        // broken line, get more bytes from socket.
  890.                                     {
  891.                                         char *newbuf = AllocVec(1024, MEMF_ANY|MEMF_CLEAR);
  892.                                         if (ptr2 - ptr < 1024)
  893.                                         {
  894.                                             CopyMem(ptr, newbuf, ptr2 - ptr);        // copy first segment of line into new buffer.
  895.                                             ptr = newbuf + (ptr2 - ptr);                // start for next segment
  896.                                             if (readsocket(s, ptr, 1023 - (ptr2 - ptr)) == -1) // failat on readsocket ??
  897.                                             {
  898.                                                 printf("readsocket result\n");
  899.                                                 quit = TRUE;
  900.                                             }
  901.                                             ptr = newbuf;
  902.                                             lineok = TRUE;
  903.                                         }
  904.                                         else
  905.                                         {
  906.                                             printf("unexpected error\n");            // is line bigger as 1024 bytes ?????
  907.                                             quit = TRUE;
  908.                                         }
  909.                                     }
  910.                                     if (!quit)
  911.                                     {
  912.                                         ULONG id;
  913.                                         ULONG UID_size = 0;
  914.                                         char  *uidptr;
  915.                                         while (*ptr && !isdigit(*ptr))
  916.                                             ptr++;
  917.                                         StrToLong(ptr, (LONG *)&id);        // copy number of mail
  918.                                         printf("get id: %d\n",id);
  919.                                         while (header->ln_Succ && header->id != id)
  920.                                         {
  921.                                             header = header->ln_Succ;
  922.                                         }
  923.                                         if (header->ln_Succ && header->id == id)
  924.                                         {
  925.                                             uidptr = header->uid;
  926.                                             while (isdigit(*ptr))
  927.                                                 ptr++;
  928.                                             while (*ptr && !isgraph(*ptr))
  929.                                                 ptr++;
  930.                                             while (isgraph(*ptr) && UID_size++ < 80)
  931.                                                 *uidptr++ = *ptr++;
  932.                                             *uidptr = 0;
  933.                                             printf("uid: %d %s\n",header->id,header->uid);
  934.                                         }
  935.                                         else
  936.                                         {
  937.                                             printf("can't find message id. internal failat\n");
  938.                                             quit = TRUE;
  939.                                         }
  940.                                         while (*ptr && *ptr != 13 && *ptr != 10)    // set ptr to end of line
  941.                                             ptr++;
  942.                                         while (*ptr && (*ptr == 10 | *ptr == 13))
  943.                                             ptr++;
  944.                                     }
  945.                                 }
  946.                                 if (buffer)
  947.                                     FreeVec(buffer);
  948.                             }
  949.  
  950.                 /*** RETR <> ***/
  951.  
  952.                             printf("check duplicate messages\n");
  953.                             if (!result)
  954.                             {
  955.                                 if (!IsListEmpty((List *)&savedlist))
  956.                                 {
  957.                                     struct INet_MailHeader *savedheader  = (struct INet_MailHeader *)savedlist.lh_Head;
  958.                                     struct INet_MailHeader *serverheader;
  959.                                     char found;
  960.                                     while (savedheader->ln_Succ)
  961.                                     {
  962.                                         serverheader = (struct INet_MailHeader *)serverlist.lh_Head;
  963.                                         found = FALSE;
  964.                                         while (!found && serverheader->ln_Succ)
  965.                                         {
  966.                                             if (!strcmp(serverheader->uid,savedheader->uid))
  967.                                             {
  968.                                                 found = TRUE;
  969.                                                 printf("%s alread loaded.\n",serverheader->uid);
  970.                                                 Remove((Node *)serverheader);
  971.                                                 FreeVec(serverheader);
  972.                                             }
  973.                                             serverheader = serverheader->ln_Succ;
  974.                                         }
  975.                                         savedheader  = savedheader->ln_Succ;
  976.                                     }
  977.                                 }
  978.                                 if (IsListEmpty((List *)&serverlist))
  979.                                 {
  980.                                     printf("all messages already loaded.\n");
  981.                                     result = TRUE;
  982.                                 }
  983.                             }
  984.  
  985.                             if (!result)
  986.                             {
  987.                                 ULONG readsize;
  988.                                 ULONG getsize;
  989.                                 BPTR  text_fh;
  990.                                 INet_MailHeader *header = (INet_MailHeader *)serverlist.lh_Head;
  991.                                 while (header->ln_Succ)
  992.                                 {
  993.                                     strncpy(header->filename, header->uid, 20);
  994.  
  995.  
  996.                                     if (fullpath[length_fp - 1] == ':' | fullpath[length_fp - 1] == '/')
  997.                                         sprintf(path,"%s%s",fullpath,header->filename);
  998.                                     else
  999.                                         sprintf(path,"%s/%s",fullpath,header->filename);
  1000.  
  1001.                                     if ((text_fh = Open(path, MODE_NEWFILE)))
  1002.                                     {
  1003.                                         printf("GET MAIL: %d %d\n",header->id,header->size);
  1004.                                         sprintf(buf,"RETR %d\r\n",header->id);
  1005.                                         if ((buffer = SendKey(s,buf)))
  1006.                                         {
  1007.                                             if (buffer[0] == '+' && buffer[1] == 'O' && buffer[2] == 'K')
  1008.                                             {
  1009.                                                 readsize = 0;
  1010.                                                 printf("mail:>\n%s",buffer);
  1011.                                                 while (!result && readsize < header->size)
  1012.                                                 {
  1013.                                                     ClearMem(buffer,1024);
  1014.                                                     if ((header->size - readsize) > 1023)
  1015.                                                         getsize = recv(s,buffer,1023,0);
  1016.                                                     else
  1017.                                                         getsize = recv(s,buffer,header->size - readsize,0);
  1018.                                                     if (getsize != -1)
  1019.                                                     {
  1020. //                                                        printf("%s",buffer);
  1021.                                                         Write(text_fh,buffer,getsize);
  1022.                                                         readsize = readsize + getsize;
  1023.                                                     }
  1024.                                                     else
  1025.                                                     {
  1026.                                                         printf("readsocket failat: %d\n",getsize);
  1027.                                                         result = TRUE;
  1028.                                                     }
  1029.                                                 }
  1030.                                                 recv(s,buffer,1023,0);    // end-block 'CR LF . CR LF sequence
  1031.                                             }
  1032.                                             else
  1033.                                             {
  1034.                                                 printf("wrong password: %s",buffer);
  1035.                                                 result = TRUE;
  1036.                                             }
  1037.                                             FreeVec(buffer);
  1038.                                         }
  1039.                                         else
  1040.                                             result = TRUE;
  1041.                                         Close(text_fh);
  1042.                                         if (!result)
  1043.                                         {
  1044.                                             Write(fh, header, sizeof(INet_MailHeader));
  1045.                                         }
  1046.                                         else
  1047.                                         {
  1048. //                                            DeleteFile(filename);
  1049.                                         }
  1050.                                         
  1051.                                     }
  1052.                                     header = header->ln_Succ;
  1053.                                 }
  1054.                             }
  1055. //                            if (!result)
  1056.                             {
  1057.                                 sprintf(buf,"QUIT\r\n");
  1058.                                 if ((buffer = SendKey(s,buf)))
  1059.                                 {
  1060.                                     if (buffer[0] == '+' && buffer[1] == 'O' && buffer[2] == 'K')
  1061.                                     {
  1062.                                         printf("logged out.\n");
  1063.                                     }
  1064.                                     else
  1065.                                     {
  1066.                                         printf("logout failat: %s",buffer);
  1067.                                         result = TRUE;
  1068.                                     }
  1069.                                     FreeVec(buffer);
  1070.                                 }
  1071.                                 else
  1072.                                     result = TRUE;
  1073.                             }
  1074.     
  1075.                         }
  1076.                     }
  1077.                 }
  1078.                 server = server->ln_Succ;    
  1079.         //        cleanup_sockets();                    
  1080.             }
  1081.     
  1082.     
  1083.             CloseLibrary(SocketBase);
  1084.         }
  1085.         else
  1086.             printf("can't open bsdsocket.library\n");
  1087.         Close(fh);
  1088.     }
  1089.     else
  1090.         printf("can't open .index\n");
  1091.     return(result);
  1092. }
  1093.  
  1094. char *SendKey(int socket, char *string)
  1095. {
  1096.     char *buf = NULL;
  1097.     if (string)
  1098.     {
  1099.         if ((buf = AllocVec(1024, MEMF_ANY|MEMF_CLEAR)))
  1100.         {
  1101.             if (send(socket,string,strlen(string),0) != -1)
  1102.             {
  1103.                 fd_set readable;
  1104.                 ULONG mask;
  1105.                 FD_ZERO(&readable);
  1106.                 FD_SET(0, &readable);
  1107.                 tv.tv_secs    = 20;
  1108.                 tv.tv_micro    = 0;
  1109.                 if ((mask = WaitSelect(1, &readable, NULL, NULL, &tv, 0)))
  1110.                 {
  1111.                     if (recv(socket,buf,1023,0) == -1)
  1112.                     {
  1113.                         FreeVec(buf);
  1114.                         buf = 0;
  1115.                     }
  1116.                     else
  1117.                         printf("read ok: %s\n",buf);
  1118.                 }
  1119.                 else
  1120.                 {
  1121.                     FreeVec(buf);
  1122.                     buf = 0;
  1123.                 }
  1124.             }
  1125.             else
  1126.             {
  1127.                 FreeVec(buf);
  1128.                 buf = 0;
  1129.             }
  1130.         }
  1131.     }
  1132.     return buf;
  1133. }
  1134.  
  1135. int readsocket(int socket, char *ptr, ULONG len)
  1136. {
  1137.     int result = -1;
  1138.     if (socket && ptr && len)
  1139.     {
  1140.         fd_set readable;
  1141.         ULONG mask;
  1142.         FD_ZERO(&readable);
  1143.         FD_SET(0, &readable);
  1144.         tv.tv_secs    = 5;
  1145.         tv.tv_micro    = 0;
  1146.         if ((mask = WaitSelect(1, &readable, NULL, NULL, &tv, 0)))
  1147.         {
  1148.             result = recv(socket,ptr,len,0);
  1149.         }
  1150.     }
  1151.     return result;
  1152. }
  1153.  
  1154.  
  1155. void bzero(APTR start, ULONG len)
  1156. {
  1157.     ClearMem(start, len);
  1158. }
  1159.  
  1160. int mystrcmp(char *str1, char *str2)
  1161. {
  1162.     char *ptr1 = str1;
  1163.     char *ptr2 = str2;
  1164.     int result = TRUE;
  1165.     while (isspace(*ptr1))
  1166.         ptr1++;
  1167.     while (result && *ptr1 && *ptr2)
  1168.     {
  1169.         if (toupper(*ptr1) == toupper(*ptr2))
  1170.         {
  1171.             ptr1++; ptr2++;
  1172.         }
  1173.         else
  1174.         {
  1175.             if (!isspace(*ptr1) | *ptr2 != 0)
  1176.                 result = FALSE;
  1177.         }
  1178.     }
  1179.     return(result);
  1180. }
  1181.  
  1182.  
  1183. void __saveds ASM nslib_CopyUUCPName(register __a0 char *string, register __a1 char *RealName, register __a2 char *Name)
  1184. {
  1185.     char *ptr        = string;
  1186.     char *ptr2;
  1187.     char *realname    = RealName;
  1188.     char *name        = Name;
  1189.     char *endrealname;
  1190.  
  1191.     while (*ptr && *ptr != ':')    // jump to :
  1192.         ptr++;
  1193.     if (*ptr == ':')
  1194.         ptr++;
  1195.     while (isspace(*ptr))            // jump to first char of name
  1196.         ptr++;
  1197.     ptr2 = ptr;
  1198.     while (*ptr2 && *ptr2 != '@')    // suche @
  1199.         ptr2++;
  1200.     if (*ptr2 == '@')
  1201.     {
  1202.         ptr2--;
  1203.         while (uucp_char[*ptr2])
  1204.             ptr2--;
  1205.     }
  1206.     endrealname = ptr2;
  1207.     ptr2++;
  1208.     while (*ptr2 && uucp_char[*ptr2])
  1209.         *name++ = *ptr2++;
  1210.  
  1211.     *name = 0;
  1212.     while (*ptr && ptr < endrealname)
  1213.     {
  1214.         if (uucp_char[*ptr] | isspace(*ptr))
  1215.             *realname++ = *ptr++;
  1216.         else
  1217.             ptr++;
  1218.     }
  1219.     while (isspace(realname[-1]))
  1220.         realname--;
  1221.     *realname = 0;
  1222. }
  1223.  
  1224. UBYTE __saveds ASM nslib_GetUUCPMonth(register __a0 char *string)
  1225. {
  1226.     char date[4];
  1227.     date[0] = string[0];
  1228.     date[1] = string[1];
  1229.     date[2] = string[2];
  1230.     date[3] = 0;
  1231.     if (!strcmp(date, "Jan"))
  1232.         return 1;
  1233.     else if (!strcmp(date, "Feb"))
  1234.         return 2;
  1235.     else if (!strcmp(date, "Mar"))
  1236.         return 3;
  1237.     else if (!strcmp(date, "Apr"))
  1238.         return 4;
  1239.     else if (!strcmp(date, "May"))
  1240.         return 5;
  1241.     else if (!strcmp(date, "Jun"))
  1242.         return 6;
  1243.     else if (!strcmp(date, "Jul"))
  1244.         return 7;
  1245.     else if (!strcmp(date, "Aug"))
  1246.         return 8;
  1247.     else if (!strcmp(date, "Sep"))
  1248.         return 9;
  1249.     else if (!strcmp(date, "Oct"))
  1250.         return 10;
  1251.     else if (!strcmp(date, "Nov"))
  1252.         return 11;
  1253.     else if (!strcmp(date, "Dec"))
  1254.         return 12;
  1255.     else
  1256.         return 0;
  1257. }
  1258.  
  1259. void __saveds ASM nslib_ConvertUUCPDate(register __a0 char *string, register __a1 struct Date *date)
  1260. {
  1261.     //    Tue, 07 Sep 1999 18:21:00 +0100
  1262.     char *ptr = string;
  1263.     LONG result;
  1264.  
  1265.     while (*ptr && *ptr != ':')
  1266.         ptr++;
  1267.     if (*ptr == ':')
  1268.         ptr++;
  1269.  
  1270.     while (*ptr && !isdigit(*ptr))
  1271.         ptr++;
  1272.     if (*ptr)
  1273.     {
  1274.         StrToLong(ptr,&result);
  1275.         date->day = (UBYTE) result;
  1276.         
  1277.         while (*ptr && !isalpha(*ptr))
  1278.             ptr++;
  1279.     
  1280.         date->month = GetUUCPMonth(ptr);
  1281.         
  1282.         while (*ptr && isgraph(*ptr))
  1283.             ptr++;
  1284.         
  1285.         if (*ptr)
  1286.         {
  1287.             while (*ptr && !isdigit(*ptr))
  1288.                 ptr++;
  1289.             StrToLong(ptr,&result);
  1290.             if (result < 100)                                // Y2K Correcting ( 19xx or 20xx ???)
  1291.             {
  1292.                 date->year = (UWORD)result + 1900;
  1293.             }
  1294.             else
  1295.                 date->year = (UWORD)result;
  1296.             while (isdigit(*ptr))
  1297.                 ptr++;
  1298.             if (*ptr)
  1299.             {
  1300.                 while (*ptr && !isdigit(*ptr))
  1301.                     ptr++;
  1302.                 if (*ptr)
  1303.                 {
  1304.                     StrToLong(ptr, &result);
  1305.                     date->hours = (UBYTE)result;
  1306.                     ptr = ptr + 3;
  1307.                     StrToLong(ptr, &result);
  1308.                     date->mins = (UBYTE)result;
  1309.                     ptr = ptr + 3;
  1310.                     StrToLong(ptr, &result);
  1311.                     date->secs = (UBYTE)result;
  1312.                     ptr = ptr + 3;
  1313.                     CalcDatecode(date);
  1314.                 }
  1315.             }
  1316.         }
  1317.     }
  1318. }
  1319.  
  1320.  
  1321.  
  1322.